package main

import (
	"fmt"
	"io"
	"os"
)

type NewLimitReader struct {
	r  io.Reader
	ln int
}

// io.Reader的数据放到p中，当读到第n个字节时返回EOF
// Read通常是循环读
func (nlr *NewLimitReader) Read(p []byte) (n int, err error) {
	// n, err = nlr.r.Read(p)
	// if n > nlr.n {
	// 	err = io.EOF
	// 	n = int(nlr.n)
	// }

	// return n, err

	if nlr.ln <= 0 {
		return 0, io.EOF
	}

	// 通过slice丢弃多余的数据，io.Reader直接会返回EOF
	if len(p) > nlr.ln {
		p = p[:nlr.ln]
	}

	n, err = nlr.r.Read(p)
	nlr.ln -= n
	return

}

// 把结束位置n保存起来
// io.Reader保存起来
func LimitReader(r io.Reader, n int64) io.Reader {
	nlr := NewLimitReader{r: r, ln: int(n)}
	return &nlr
}

func main() {
	// var r io.Reader
	// r.Read([]byte("hello world"))  xxx

	file, err := os.Open("74newreader.go")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	rn := LimitReader(file, 5)
	data := make([]byte, 20)
	n, err := rn.Read(data)
	if err != nil {
		fmt.Println(err)
		panic(err)
	}
	fmt.Println(n, data, string(data))
}
